package com.learning.spring.aop.aspectj.pointcut.expression.function;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

/**
 * ClassName: MethodPointcutFunction
 * Description: 方法入参切点函数：args、@args
 * Date: 2020/10/15 10:25 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
@Aspect
public class MethodArgsPointcutFunction {

    /**
     * 1. 表示运行时入参是 `User` 类型的方法
     * 2. args 函数，接收一个类名，表示目标类方法入参对象是指定类（包含子类）的匹配
     * 3. 例子：
     * 3.1 匹配目标类中 select(User user) 方法
     */
    @Before("args(com.learning.spring.aop.aspectj.pointcut.expression.entity.User)")
    public void args() {
        System.out.println("Hello args Function");
    }


    /**
     * 注解：@args 函数，接收一个注解类的类名。当方法运行时，入参对象标注了指定的注解时，匹配切点。
     * 【注意】入参对象的击继承关系。
     * 修改实体类User，标注注解 LogEntity，则匹配目标类中 select(User user) 方法
     */
    @Before("@args(com.learning.spring.aop.aspectj.pointcut.expression.annotation.LogEntity)")
    public void argsAnnotation() {
        System.out.println("Hello @args Function");
    }


}
